package utils;

import com.itextpdf.text.*;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.*;
import model.AttributeDefinition;
import model.LogisticsInfo;
import model.LogisticsHighlight;
import model.Customer;
import service.AttributeService;
import org.apache.commons.io.IOUtils;

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Comparator;

public class PdfUtil {

    /**
     * 创建单个客户的PDF文件
     * @param logisticsInfo 客户的物流信息对象
     */
    public void createPdf(LogisticsInfo logisticsInfo) {
        try {
            // 生成默认文件名：客户名+日期
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String currentDate = sdf.format(new Date());
            String defaultFileName = logisticsInfo.getName() + "_" + currentDate + ".pdf";
            
            // 打开文件选择器，让用户选择保存PDF的位置
            String savePath = chooseSaveFile("选择保存PDF文件的位置", defaultFileName);
            if (savePath == null) {
                System.out.println("未选择保存路径，操作已取消。");
                return;
            }

            // 获取标红信息
            LogisticsHighlight highlight = DBUtil.getLogisticsHighlightByLogisticsId(logisticsInfo.getId());

            // 调用通用方法创建PDF文件并写入物流信息
            writePdfDocument(savePath, logisticsInfo, highlight);
            System.out.println("PDF文件生成成功，保存路径：" + savePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 批量创建多个客户的PDF文件并合并
     * @param logisticsInfos 客户物流信息的列表
     */
    public void createPdfs(List<LogisticsInfo> logisticsInfos) {
        try {
            // 获取当前时间并格式化
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
            String currentTime = sdf.format(new Date());
            String defaultFileName = "客户物流发运需求明细表_" + currentTime + ".pdf";
            
            // 打开文件选择器，让用户选择保存合并后PDF的位置
            String mergedPdfPath = chooseSaveFile("选择保存合并后的PDF文件", defaultFileName);
            if (mergedPdfPath == null) {
                System.out.println("未选择保存路径，操作已取消。");
                return;
            }

            // 保持原始列表顺序，不进行排序
            List<LogisticsInfo> orderedList = new ArrayList<>(logisticsInfos);
            
            // 直接创建一个包含所有客户信息的PDF文件
            createMergedPdf(orderedList, mergedPdfPath);
            System.out.println("客户PDF生成成功，保存路径为：" + mergedPdfPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 直接创建一个包含所有客户信息的PDF文件，避免中间文件生成
     * @param logisticsInfos 客户物流信息列表
     * @param outputPath 输出PDF路径
     * @throws Exception 异常
     */
    private void createMergedPdf(List<LogisticsInfo> logisticsInfos, String outputPath) throws Exception {
        if (logisticsInfos == null || logisticsInfos.isEmpty()) {
            throw new IllegalArgumentException("客户物流信息列表不能为空");
        }
        
        // 创建PDF文档对象，设置页面大小为A4
        Document document = new Document(PageSize.A4);
        
        // 创建PDF写入器，将内容写入到指定文件
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputPath));
        
        // 添加页码事件处理器
        PageNumberHandler pageHandler = new PageNumberHandler();
        writer.setPageEvent(pageHandler);
        
        // 打开文档，准备向其中添加内容
        document.open();
        
        // 加载字体资源
        Font normalFont = loadFont(12); // 普通字体，字体大小调整为12
        Font highlightFont = loadFont(12, Font.NORMAL, BaseColor.RED); // 高亮字体，红色
        Font titleFont = loadFont(18, Font.BOLD); // 标题字体，字体大小调整为18
        
        // 加载图片资源
        Image leftImage = loadImage("images/ox.jpg", 180);
        Image rightImage = loadImage("images/car.jpg", 150);
        
        // 遍历每个客户，为每个客户添加一页
        for (int i = 0; i < logisticsInfos.size(); i++) {
            LogisticsInfo logisticsInfo = logisticsInfos.get(i);
            
            // 获取标红信息
            LogisticsHighlight highlight = DBUtil.getLogisticsHighlightByLogisticsId(logisticsInfo.getId());
            
            // 如果不是第一页，先添加新页
            if (i > 0) {
                document.newPage();
            }
            
            // 设置图片的位置
            if (leftImage != null) {
                Image leftImageCopy = Image.getInstance(leftImage);
                leftImageCopy.setAbsolutePosition(50, document.getPageSize().getHeight() - 120);
                document.add(leftImageCopy);
            }
            
            if (rightImage != null) {
                Image rightImageCopy = Image.getInstance(rightImage);
                rightImageCopy.setAbsolutePosition(document.getPageSize().getWidth() - 200, document.getPageSize().getHeight() - 150);
                document.add(rightImageCopy);
            }
            
            // 添加标题，确保标题与图片分开
            Paragraph title = new Paragraph("客户物流发运需求明细表", titleFont);
            title.setAlignment(Element.ALIGN_CENTER);
            title.setSpacingBefore(100); // 确保标题不会被图片覆盖
            title.setSpacingAfter(40); // 标题和内容之间的间距
            document.add(title);
            
            // 将客户的物流信息写入到PDF文档
            addLogisticsInfoToDocument(document, logisticsInfo, normalFont, highlightFont, highlight);
        }
        
        // 关闭文档
        document.close();
    }

    /**
     * 页码处理器，在页面底部居中添加页码
     */
    private class PageNumberHandler extends PdfPageEventHelper {
        private Font pageFont;
        
        public PageNumberHandler() {
            // 初始化页码字体
            pageFont = loadFont(8, Font.NORMAL); // 页码字体调整为8
        }
        
        @Override
        public void onEndPage(PdfWriter writer, Document document) {
            PdfContentByte cb = writer.getDirectContent();
            
            // 获取当前页码
            int pageNumber = writer.getPageNumber();
            
            // 创建页码文本
            String text = String.valueOf(pageNumber);
            
            // 计算页码位置（居中底部）
            float textBase = document.bottom() - 20;
            float textSize = pageFont.getBaseFont().getWidthPoint(text, pageFont.getSize());
            float textX = (document.right() - document.left() - textSize) / 2 + document.leftMargin();
            
            // 添加页码
            cb.beginText();
            cb.setFontAndSize(pageFont.getBaseFont(), pageFont.getSize());
            cb.setTextMatrix(textX, textBase);
            cb.showText(text);
            cb.endText();
        }
    }

    /**
     * 通用方法：创建PDF文档并写入客户的物流信息
     * @param pdfPath PDF文件保存路径
     * @param logisticsInfo 客户的物流信息对象
     * @param highlight 标红信息对象
     * @throws Exception
     */
    private void writePdfDocument(String pdfPath, LogisticsInfo logisticsInfo, LogisticsHighlight highlight) throws Exception {
        // 创建PDF文档对象，设置页面大小为A4
        Document document = new Document(PageSize.A4);

        // 创建PDF写入器，将内容写入到指定文件
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
        
        // 添加页码事件处理器
        PageNumberHandler pageHandler = new PageNumberHandler();
        writer.setPageEvent(pageHandler);

        // 打开文档，准备向其中添加内容
        document.open();

        // 加载字体资源
        Font normalFont = loadFont(12); // 普通字体，字体大小调整为12
        Font highlightFont = loadFont(12, Font.NORMAL, BaseColor.RED); // 高亮字体，红色
        Font titleFont = loadFont(18, Font.BOLD); // 标题字体，字体大小调整为18

        // 加载图片资源
        Image leftImage = loadImage("images/ox.jpg", 180); // 左上角图片，放大至180宽
        Image rightImage = loadImage("images/car.jpg", 150); // 右上角图片

        // 设置图片的位置
        if (leftImage != null) {
            leftImage.setAbsolutePosition(50, document.getPageSize().getHeight() - 120); // 左上角位置，上移
            document.add(leftImage);
        }
        if (rightImage != null) {
            rightImage.setAbsolutePosition(document.getPageSize().getWidth() - 200, document.getPageSize().getHeight() - 150); // 右上角位置
            document.add(rightImage);
        }

        // 添加标题，确保标题与图片分开
        Paragraph title = new Paragraph("客户物流发运需求明细表", titleFont);
        title.setAlignment(Element.ALIGN_CENTER);
        title.setSpacingBefore(120); // 确保标题不会被图片覆盖
        title.setSpacingAfter(40); // 标题和内容之间的间距
        document.add(title);

        // 将客户的物流信息写入到PDF文档
        addLogisticsInfoToDocument(document, logisticsInfo, normalFont, highlightFont, highlight);

        // 关闭文档
        document.close();
    }

    /**
     * 将客户的物流信息对象内容添加到PDF文档（兼容旧版本调用）
     * @param document PDF文档对象
     * @param logisticsInfo 客户物流信息对象
     * @param font 用于内容显示的字体
     * @throws DocumentException
     */
    private void addLogisticsInfoToDocument(Document document, LogisticsInfo logisticsInfo, Font font) throws DocumentException {
        // 获取标红信息
        LogisticsHighlight highlight = DBUtil.getLogisticsHighlightByLogisticsId(logisticsInfo.getId());
        // 创建高亮字体
        Font highlightFont = loadFont((int)font.getSize(), font.getStyle(), BaseColor.RED);
        // 调用新版本方法
        addLogisticsInfoToDocument(document, logisticsInfo, font, highlightFont, highlight);
    }

    /**
     * 将客户的物流信息对象内容添加到PDF文档
     * @param document PDF文档对象
     * @param logisticsInfo 客户物流信息对象
     * @param normalFont 用于正常内容显示的字体
     * @param highlightFont 用于高亮内容显示的字体
     * @param highlight 标红信息对象
     * @throws DocumentException
     */
    private void addLogisticsInfoToDocument(Document document, LogisticsInfo logisticsInfo, 
                                          Font normalFont, Font highlightFont, LogisticsHighlight highlight) 
                                          throws DocumentException {
        // 添加字段到 PDF 文档，根据highlight决定使用哪种字体
        document.add(new Paragraph("客户名称: " + logisticsInfo.getName(), 
            (highlight != null && highlight.getNameHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("仓库地址: " + logisticsInfo.getAddress(), 
            (highlight != null && highlight.getAddressHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("里程 (KM): " + logisticsInfo.getKm(), 
            (highlight != null && highlight.getKmHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("客户联系人: " + logisticsInfo.getContacts(), 
            (highlight != null && highlight.getContactsHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("到达要求时间: " + logisticsInfo.getTimeInput(), 
            (highlight != null && highlight.getTimeInputHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("是否要求到达首战: " +  logisticsInfo.getIsFirstBattleArrival(),
            (highlight != null && highlight.getIsFirstBattleArrivalHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("车厢温度要求(°C): " + logisticsInfo.getTruckTempMin() + "°C ~ " + logisticsInfo.getTruckTempMax() + "°C", 
            (highlight != null && (highlight.getTruckTempMinHighlight() == 1 || highlight.getTruckTempMaxHighlight() == 1)) 
            ? highlightFont : normalFont));
            
        document.add(new Paragraph("产品温度要求(°C): " + logisticsInfo.getProductTempMin() + "°C ~ " + logisticsInfo.getProductTempMax() + "°C", 
            (highlight != null && (highlight.getProductTempMinHighlight() == 1 || highlight.getProductTempMaxHighlight() == 1)) 
            ? highlightFont : normalFont));
            
        document.add(new Paragraph("测温方式: " + logisticsInfo.getMeasureMethod(), 
            (highlight != null && highlight.getMeasureMethodHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("温控设备需求品牌/类型: " + logisticsInfo.getEquipmentType(), 
            (highlight != null && highlight.getEquipmentTypeHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("温控设备数量: " + logisticsInfo.getEquipmentNum(), 
            (highlight != null && highlight.getEquipmentNumHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("是否开箱测温: " + logisticsInfo.getOpenBox(), 
            (highlight != null && highlight.getOpenBoxHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("是否带托运输: " + logisticsInfo.getTrayTransport(), 
            (highlight != null && highlight.getTrayTransportHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("是否提供卸货服务: " + logisticsInfo.getUnloadingService(), 
            (highlight != null && highlight.getUnloadingServiceHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("卸货服务收费标准(元/吨): " + logisticsInfo.getUnloadingCost(), 
            (highlight != null && highlight.getUnloadingCostHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("是否需要预约: " + logisticsInfo.getAppointment(), 
            (highlight != null && highlight.getAppointmentHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("随车单据需求: " + logisticsInfo.getDocumentNeed(), 
            (highlight != null && highlight.getDocumentNeedHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("是否盖章签收确认: " + logisticsInfo.getStampConfirm(), 
            (highlight != null && highlight.getStampConfirmHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("如湿箱能否更换无批纸箱子: " + logisticsInfo.getReplaceBox(), 
            (highlight != null && highlight.getReplaceBoxHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("异常晚到是否可延迟收货: " + logisticsInfo.getDelayAccept(), 
            (highlight != null && highlight.getDelayAcceptHighlight() == 1) ? highlightFont : normalFont));
            
        document.add(new Paragraph("其他需求: " + logisticsInfo.getOtherNeeds(), 
            (highlight != null && highlight.getOtherNeedsHighlight() == 1) ? highlightFont : normalFont));
    }

    /**
     * 打开文件选择器，选择文件保存位置
     * @param dialogTitle 对话框标题
     * @param defaultFileName 默认文件名（包括扩展名）
     * @return 返回选择的文件完整路径
     */
    public String chooseSaveFile(String dialogTitle, String defaultFileName) {
        try {
            // 使用 AWT 的 FileDialog 替代 JFileChooser
            FileDialog fileDialog = new FileDialog((Frame) null, dialogTitle, FileDialog.SAVE);
            fileDialog.setDirectory(System.getProperty("user.home")); // 默认打开用户主目录
            fileDialog.setFile(defaultFileName); // 设置默认文件名
            
            // 设置弹窗大小
            fileDialog.setSize(1000, 900);
            
            fileDialog.setVisible(true); // 显示对话框
            
            // 获取用户选择的路径
            String directory = fileDialog.getDirectory();
            String filename = fileDialog.getFile();
            
            if (directory != null && filename != null) {
                // 确保文件名以.pdf结尾
                if (!filename.toLowerCase().endsWith(".pdf")) {
                    filename += ".pdf";
                }
                return directory + filename;
            }
            return null; // 用户取消选择
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 创建指定大小和样式的字体
     * @param size 字体大小
     * @param style 字体样式
     * @param color 字体颜色
     * @return 字体对象
     */
    public Font loadFont(int size, int style, BaseColor color) {
        try {
            // 尝试加载本地中文字体资源
            String fontPath = "/fonts/simsun.ttc"; // 宋体，适用于中文显示
            InputStream is = getClass().getResourceAsStream(fontPath);
            if (is == null) {
                System.out.println("无法加载字体文件：" + fontPath);
                // 使用默认中文字体
                return FontFactory.getFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED, size, style, color);
            } else {
                byte[] fontData = toByteArray(is);
            BaseFont baseFont = BaseFont.createFont("simsun.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, true, fontData, null);
                return new Font(baseFont, size, style, color);
            }
        } catch (Exception e) {
            e.printStackTrace();
            // 使用默认字体
            return new Font(Font.FontFamily.TIMES_ROMAN, size, style, color);
        }
    }

    // 兼容旧方法
    public Font loadFont(int size, int style) {
        return loadFont(size, style, BaseColor.BLACK);
    }

    // 兼容旧方法
    private Font loadFont(int size) {
        return loadFont(size, Font.NORMAL, BaseColor.BLACK);
    }

    // 工具方法：将 InputStream 转换为字节数组
    private byte[] toByteArray(InputStream inputStream) throws IOException {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        int nRead;
        byte[] data = new byte[1024];
        while ((nRead = inputStream.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }
        return buffer.toByteArray();
    }

    /**
     * 加载图片并设置大小
     * @param imagePath 图片路径
     * @param maxWidth  图片最大宽度限制
     * @return 返回图片对象
     */
    private Image loadImage(String imagePath, float maxWidth) {
        try {
            InputStream imageStream = getClass().getClassLoader().getResourceAsStream(imagePath);
            if (imageStream == null) {
                return null;
            }
            byte[] imageBytes = IOUtils.toByteArray(imageStream);
            Image img = Image.getInstance(imageBytes);
            if (img.getWidth() > maxWidth) {
                img.scaleToFit(maxWidth, img.getHeight());
            }
            return img; // 返回加载并缩放后的图片对象
        } catch (Exception e) {
            e.printStackTrace();
            return null; // 图片加载失败时返回null
        }
    }

    /**
     * 将Customer对象的内容添加到PDF文档中，只显示客户实际拥有的属性
     * @param document PDF文档对象
     * @param customer 客户对象
     * @param normalFont 用于正常内容显示的字体
     * @param highlightFont 用于高亮内容显示的字体
     * @throws DocumentException
     */
    private void addCustomerInfoToDocument(Document document, Customer customer, 
                                         Font normalFont, Font highlightFont) 
                                         throws DocumentException {
        // 添加客户名称
        document.add(new Paragraph("客户名称: " + customer.getCustomerName(), normalFont));
        
        // 获取客户的属性值
        Map<Integer, String> attributeValues = customer.getAttributeValues();
        
        // 只添加客户实际拥有的属性
        for (Map.Entry<Integer, String> entry : attributeValues.entrySet()) {
            int attributeId = entry.getKey();
            String value = entry.getValue();
            
            // 通过attributeId获取属性定义
            AttributeDefinition attr = AttributeService.getAttributeById(attributeId);
            if (attr != null) {
                String displayName = attr.getDisplayName();
                
                // 判断是否需要高亮显示
                boolean isHighlighted = customer.isAttributeHighlighted(attributeId);
                
                // 根据高亮状态选择字体
                Font fontToUse = isHighlighted ? highlightFont : normalFont;
                
                document.add(new Paragraph(displayName + ": " + value, fontToUse));
            }
        }
    }
    
    /**
     * 创建单个客户的PDF文件（基于EAV模型）
     * @param customer 客户对象
     */
    public void createCustomerPdf(Customer customer) {
        try {
            // 生成默认文件名：客户名+日期
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String currentDate = sdf.format(new Date());
            String defaultFileName = customer.getCustomerName() + "_" + currentDate + ".pdf";
            
            // 打开文件选择器，让用户选择保存PDF的位置
            String savePath = chooseSaveFile("选择保存PDF文件的位置", defaultFileName);
            if (savePath == null) {
                System.out.println("未选择保存路径，操作已取消。");
                return;
            }

            // 调用通用方法创建PDF文件并写入客户信息
            writeCustomerPdfDocument(savePath, customer);
            System.out.println("PDF文件生成成功，保存路径：" + savePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 批量创建多个客户的PDF文件并合并（基于EAV模型）
     * @param customers 客户列表
     */
    public void createCustomerPdfs(List<Customer> customers) {
        try {
            // 获取当前时间并格式化
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
            String currentTime = sdf.format(new Date());
            String defaultFileName = "客户信息明细表_" + currentTime + ".pdf";
            
            // 打开文件选择器，让用户选择保存合并后PDF的位置
            String mergedPdfPath = chooseSaveFile("选择保存合并后的PDF文件", defaultFileName);
            if (mergedPdfPath == null) {
                System.out.println("未选择保存路径，操作已取消。");
                return;
            }

            // 保持原始列表顺序，不进行排序
            List<Customer> orderedList = new ArrayList<>(customers);
            
            // 直接创建一个包含所有客户信息的PDF文件
            createMergedCustomerPdf(orderedList, mergedPdfPath);
            System.out.println("客户PDF生成成功，保存路径为：" + mergedPdfPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 直接创建一个包含所有客户信息的PDF文件，避免中间文件生成（基于EAV模型）
     * @param customers 客户列表
     * @param outputPath 输出PDF路径
     * @throws Exception 异常
     */
    private void createMergedCustomerPdf(List<Customer> customers, String outputPath) throws Exception {
        if (customers == null || customers.isEmpty()) {
            throw new IllegalArgumentException("客户信息列表不能为空");
        }
        
        // 创建PDF文档对象，设置页面大小为A4
        Document document = new Document(PageSize.A4);
        
        // 创建PDF写入器，将内容写入到指定文件
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outputPath));
        
        // 添加页码事件处理器
        PageNumberHandler pageHandler = new PageNumberHandler();
        writer.setPageEvent(pageHandler);
        
        // 打开文档，准备向其中添加内容
        document.open();
        
        // 加载字体资源
        Font normalFont = loadFont(12); // 普通字体，字体大小调整为12
        Font highlightFont = loadFont(12, Font.NORMAL, BaseColor.RED); // 高亮字体，红色
        Font titleFont = loadFont(18, Font.BOLD); // 标题字体，字体大小调整为18
        
        // 加载图片资源
        Image leftImage = loadImage("images/ox.jpg", 180);
        Image rightImage = loadImage("images/car.jpg", 150);
        
        // 遍历每个客户，为每个客户添加一页
        for (int i = 0; i < customers.size(); i++) {
            Customer customer = customers.get(i);
            
            // 如果不是第一页，先添加新页
            if (i > 0) {
                document.newPage();
            }
            
            // 设置图片的位置
            if (leftImage != null) {
                Image leftImageCopy = Image.getInstance(leftImage);
                leftImageCopy.setAbsolutePosition(50, document.getPageSize().getHeight() - 120);
                document.add(leftImageCopy);
            }
            
            if (rightImage != null) {
                Image rightImageCopy = Image.getInstance(rightImage);
                rightImageCopy.setAbsolutePosition(document.getPageSize().getWidth() - 200, document.getPageSize().getHeight() - 150);
                document.add(rightImageCopy);
            }
            
            // 添加标题，确保标题与图片分开
            Paragraph title = new Paragraph("客户信息明细表", titleFont);
            title.setAlignment(Element.ALIGN_CENTER);
            title.setSpacingBefore(100); // 确保标题不会被图片覆盖
            title.setSpacingAfter(40); // 标题和内容之间的间距
            document.add(title);
            
            // 将客户信息写入到PDF文档
            addCustomerInfoToDocument(document, customer, normalFont, highlightFont);
        }
        
        // 关闭文档
        document.close();
    }
    
    /**
     * 通用方法：创建PDF文档并写入客户信息（基于EAV模型）
     * @param pdfPath PDF文件保存路径
     * @param customer 客户对象
     * @throws Exception
     */
    private void writeCustomerPdfDocument(String pdfPath, Customer customer) throws Exception {
        // 创建PDF文档对象，设置页面大小为A4
        Document document = new Document(PageSize.A4);

        // 创建PDF写入器，将内容写入到指定文件
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfPath));
        
        // 添加页码事件处理器
        PageNumberHandler pageHandler = new PageNumberHandler();
        writer.setPageEvent(pageHandler);

        // 打开文档，准备向其中添加内容
        document.open();

        // 加载字体资源
        Font normalFont = loadFont(12); // 普通字体，字体大小调整为12
        Font highlightFont = loadFont(12, Font.NORMAL, BaseColor.RED); // 高亮字体，红色
        Font titleFont = loadFont(18, Font.BOLD); // 标题字体，字体大小调整为18

        // 加载图片资源
        Image leftImage = loadImage("images/ox.jpg", 180); // 左上角图片，放大至180宽
        Image rightImage = loadImage("images/car.jpg", 150); // 右上角图片

        // 设置图片的位置
        if (leftImage != null) {
            leftImage.setAbsolutePosition(50, document.getPageSize().getHeight() - 120); // 左上角位置，上移
            document.add(leftImage);
        }
        if (rightImage != null) {
            rightImage.setAbsolutePosition(document.getPageSize().getWidth() - 200, document.getPageSize().getHeight() - 150); // 右上角位置
            document.add(rightImage);
        }

        // 添加标题，确保标题与图片分开
        Paragraph title = new Paragraph("客户信息明细表", titleFont);
        title.setAlignment(Element.ALIGN_CENTER);
        title.setSpacingBefore(120); // 确保标题不会被图片覆盖
        title.setSpacingAfter(40); // 标题和内容之间的间距
        document.add(title);

        // 将客户信息写入到PDF文档
        addCustomerInfoToDocument(document, customer, normalFont, highlightFont);

        // 关闭文档
        document.close();
    }
}
